import { app, shell, BrowserWindow, ipcMain, globalShortcut, dialog, Tray, Menu ,Notification} from 'electron'
import { join } from 'path'
import Store from 'electron-store';
import { electronApp, optimizer, is } from '@electron-toolkit/utils'
import icon from '../../resources/icon.png?asset'
import icons from '../../resources/icon1.png?asset'
import icon2 from '../../resources/icon2.png?asset'
import { readDir } from './readDir'
import { getElectronVersion } from './version'
// 数据持久化
const store = new Store()

// 定义ipcRenderer监听事件
initIpcRenderer()
function createWindow() {
    // Create the browser window.
    const mainWindow = new BrowserWindow({
        width: 900,
        height: 670,
        show: false,
        autoHideMenuBar: true,
        icon,
        webPreferences: {
            preload: join(__dirname, '../preload/index.js'),
            sandbox: false,
            // 禁用同源策略，允许跨域请求
            webSecurity: false,
            // 禁止build环境使用DevTool
            devTools: is.dev ? true : false,
            allowRunningInsecureContent: true,
        }
    })

    mainWindow.on('ready-to-show', () => {
        mainWindow.show()
    })
    mainWindow.on('close', (e) => {
        e.preventDefault();  // 阻止退出程序
        // win.setSkipTaskbar(true)   // 取消任务栏显示
        mainWindow.hide();    // 隐藏主程序窗口
      })

    mainWindow.webContents.setWindowOpenHandler((details) => {
        shell.openExternal(details.url)
        return { action: 'deny' }
    })
    const tray = new Tray(icon);

    //新建菜单内容
       const trayContextMenu = Menu.buildFromTemplate([
           {
               label: '打开',
               icon: icons,  //图标
               click: () => {
                   //显示的方法
                   mainWindow.show()
               }
           }, {
               label: '退出',
               icon:  icons,   //图标
               click: () => {
                  //退出的方法
                  mainWindow.destroy()
                  app.quit()
               }
           }
       ]);

       //鼠标移入显示内容
       tray.setToolTip('鼠标移入时显示的文字');

        //单击左键触发
    //    tray.on('click', () => {
    //        //显示窗口的方法
    //        mainWindow.show()
    //    });

       //单机右键触发
       tray.on('right-click', () => {
           //显示菜单列表
           tray.popUpContextMenu(trayContextMenu);
       });
       var count = 0,timer = null;
       timer=setInterval(function() {
           count++;
           if (count%2 == 0) {
               tray.setImage(icons)
           } else {
               tray.setImage(icon2)
           }
       }, 600);

       //单点击 1.主窗口显示隐藏切换 2.清除闪烁
       tray.on("click", function(){
           if(!!timer){
                clearInterval(timer)
                tray.setImage(icons)
               //主窗口显示隐藏切换
               mainWindow.isVisible() ? mainWindow.hide() : mainWindow.show();
           }
   })

    // HMR for renderer base on electron-vite cli.
    // Load the remote URL for development or the local html file for production.
    if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
        mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])
    } else {
        mainWindow.loadFile(join(__dirname, '../renderer/index.html'))
    }
    // 设置DevTools快捷键
    globalShortcut.register('CommandOrControl+Shift+i', function () {
        mainWindow.webContents.openDevTools()
    })

    return mainWindow
}

// 程序单例模式
let myWindow = null
const gotTheLock = app.requestSingleInstanceLock()
if (!gotTheLock) {
    // 如果已经有同样的该程序正在运行，则不启动
    app.quit()
} else {
    // 如果检测到有同样的该程序正在试图启动...
    app.on('second-instance', (event, commandLine, workingDirectory, additionalData) => {
        if (myWindow) {
            // 弹出系统提示对话框
            dialog.showMessageBox({
                message: '此程序已经正在运行'
            })
            // 如果该程序窗口处于最小化状态，则恢复窗口
            if (myWindow.isMinimized()) myWindow.restore()
            // 将该程序窗口置为当前聚焦态
            myWindow.focus()
        }
    })

    // This method will be called when Electron has finished
    // initialization and is ready to create browser windows.
    // Some APIs can only be used after this event occurs.
    app.whenReady().then(() => {
        // Set app user model id for windows
        electronApp.setAppUserModelId('com.electron')

        // Default open or close DevTools by F12 in development
        // and ignore CommandOrControl + R in production.
        // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils
        app.on('browser-window-created', (_, window) => {
            optimizer.watchWindowShortcuts(window)
        })

        myWindow = createWindow()

        app.on('activate', function () {
            // On macOS it's common to re-create a window in the app when the
            // dock icon is clicked and there are no other windows open.
            if (BrowserWindow.getAllWindows().length === 0) createWindow()
        })

          // 发送通知
          sendNotification('Hello World', 'This is a notification message.');

    })

    // Quit when all windows are closed, except on macOS. There, it's common
    // for applications and their menu bar to stay active until the user quits
    // explicitly with Cmd + Q.
    app.on('window-all-closed', () => {
        if (process.platform !== 'darwin') {
            app.quit()
        }
    })
}
function sendNotification(title, body) {
    // 确保在 macOS 上，通知不会在 Dock 图标上显示数字
    if (process.platform === 'darwin') {
      app.dock.setBadge('');
    }

    // 创建一个新的通知
    const notification = new Notification({
      title: title,
      body: body,
      silent: true, // 通知是否是静默的
    });

    // 显示通知
    notification.show();

    // 当通知被点击时，关闭应用程序
    notification.on('click', () => {
      app.quit();
    });
  }
// In this file you can include the rest of your app"s specific main process
// code. You can also put them in separate files and require them here.
// 以上英文注释是Electron官方的main.js注释，意思是通过require()来引入其他代码文件。
// 但是由于Vite的机制，打包的时候会忽略require()，因此只能通过import方式来引入外部方法。
ipcMain.on('readDir', readDir)
ipcMain.handle('getElectronVersion', getElectronVersion)
function initIpcRenderer() {
    ipcMain.on('setStore', (_, key, value) => {
      store.set(key, value)
    })

    ipcMain.on('getStore', (_, key) => {
      let value = store.get(key)
      _.returnValue = value || ''
    })

    ipcMain.on('deleteStore', (_, key) => {
      let value = store.delete(key)
      _.returnValue = value || ''
    })
}
